package com.eastfair.venueservice.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.eastfair.core.base.entity.Entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import com.eastfair.database.mybatis.typehandler.M9EncryptHandler;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import static com.eastfair.core.utils.DateUtils.DEFAULT_DATE_TIME_FORMAT;
import com.eastfair.annotation.model.EchoVO;
import com.eastfair.venueservice.enumeration.ExhibitionSettlementInvoicingCostTypeEnum;
import com.eastfair.venueservice.enumeration.ExhibitionSettlementInvoicingStatusEnum;
import com.eastfair.venueservice.enumeration.ExhibitionSettlementInvoicingInvoiceTypeEnum;

import static com.baomidou.mybatisplus.annotation.SqlCondition.LIKE;

/**
 * <p>
 * 实体类
 * 结算开票记录
 * </p>
 *
 * @author linan
 * @since 2023-02-02
 */
@Data
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(value="vsm_exhibition_settlement_invoicing",autoResultMap = true)
@ApiModel(value = "ExhibitionSettlementInvoicing", description = "结算开票记录")
@AllArgsConstructor
public class ExhibitionSettlementInvoicing extends Entity<Long> implements EchoVO {

    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    private Map<String, Object> echoMap = new HashMap<>();
    /**
     * 是否启用：1是；0否
     */
    @ApiModelProperty(value = "是否启用：1是；0否")
    @TableField(value = "is_enabled")
    @Excel(name = "是否启用：1是；0否")
    private Integer isEnabled;

    /**
     * 是否删除：1是；0否
     */
    @ApiModelProperty(value = "是否删除：1是；0否")
    @TableField(value = "is_deleted")
    @Excel(name = "是否删除：1是；0否")
    private Integer isDeleted;

    /**
     * 项目id
     */
    @ApiModelProperty(value = "项目id")
    @TableField(value = "project_id")
    @Excel(name = "项目id")
    private Long projectId;

    /**
     * 子系统id
     */
    @ApiModelProperty(value = "子系统id")
    @TableField(value = "subsystem_id")
    @Excel(name = "子系统id")
    private Long subsystemId;

    /**
     * 租户id
     */
    @ApiModelProperty(value = "租户id")
    @TableField(value = "tenant_id")
    @Excel(name = "租户id")
    private Long tenantId;

    /**
     * 结算单号
     */
    @ApiModelProperty(value = "结算单号")
    @Size(max = 255, message = "结算单号长度不能超过255")
    @TableField(value = "settlement_no", condition = LIKE)
    @Excel(name = "结算单号")
    private String settlementNo;

    /**
     * 开票金额
     */
    @ApiModelProperty(value = "开票金额")
    @TableField(value = "invoiced_amount")
    @Excel(name = "开票金额")
    private BigDecimal invoicedAmount;

    /**
     * 开票类型 #{VAT_PAPER_SPECIAL_INVOICE:增值税纸质专用发票;VAT_PAPER_ORDINARY_INVOICE:增值税纸质普通发票;VAT_ELECTRONIC_SPECIAL_INVOICE:增值税电子专用发票;VAT_ELECTRONIC_ORDINARY_INVOICE:增值税纸质专用发票;}
     */
    @ApiModelProperty(value = "开票类型 #{VAT_PAPER_SPECIAL_INVOICE:增值税纸质专用发票;VAT_PAPER_ORDINARY_INVOICE:增值税纸质普通发票;VAT_ELECTRONIC_SPECIAL_INVOICE:增值税电子专用发票;VAT_ELECTRONIC_ORDINARY_INVOICE:增值税纸质专用发票;}")
    @TableField(value = "invoice_type")
    @Excel(name = "开票类型 #{VAT_PAPER_SPECIAL_INVOICE:增值税纸质专用发票;VAT_PAPER_ORDINARY_INVOICE:增值税纸质普通发票;VAT_ELECTRONIC_SPECIAL_INVOICE:增值税电子专用发票;VAT_ELECTRONIC_ORDINARY_INVOICE:增值税纸质专用发票;}", replace = {"增值税纸质专用发票_VAT_PAPER_SPECIAL_INVOICE", "增值税纸质普通发票_VAT_PAPER_ORDINARY_INVOICE", "增值税电子专用发票_VAT_ELECTRONIC_SPECIAL_INVOICE", "增值税纸质专用发票_VAT_ELECTRONIC_ORDINARY_INVOICE",  "_null"})
    private ExhibitionSettlementInvoicingInvoiceTypeEnum invoiceType;

    /**
     * 单位名称
     */
    @ApiModelProperty(value = "单位名称")
    @Size(max = 255, message = "单位名称长度不能超过255")
    @TableField(value = "company_name", condition = LIKE)
    @Excel(name = "单位名称")
    private String companyName;

    /**
     * 纳税人识别号
     */
    @ApiModelProperty(value = "纳税人识别号")
    @Size(max = 255, message = "纳税人识别号长度不能超过255")
    @TableField(value = "taxpayer_id_no", condition = LIKE)
    @Excel(name = "纳税人识别号")
    private String taxpayerIdNo;

    /**
     * 单位地址
     */
    @ApiModelProperty(value = "单位地址")
    @Size(max = 255, message = "单位地址长度不能超过255")
    @TableField(value = "company_address", condition = LIKE)
    @Excel(name = "单位地址")
    private String companyAddress;

    /**
     * 电话
     */
    @ApiModelProperty(value = "电话")
    @Size(max = 255, message = "电话长度不能超过255")
    @TableField(value = "tel", condition = LIKE)
    @Excel(name = "电话")
    private String tel;

    /**
     * 开户行
     */
    @ApiModelProperty(value = "开户行")
    @Size(max = 255, message = "开户行长度不能超过255")
    @TableField(value = "bank_name", condition = LIKE)
    @Excel(name = "开户行")
    private String bankName;

    /**
     * 账号
     */
    @ApiModelProperty(value = "账号")
    @Size(max = 255, message = "账号长度不能超过255")
    @TableField(value = "bank_account_num", condition = LIKE)
    @Excel(name = "账号")
    private String bankAccountNum;

    /**
     * 申请人联系方式
     */
    @ApiModelProperty(value = "申请人联系方式")
    @Size(max = 255, message = "申请人联系方式长度不能超过255")
    @TableField(value = "phone", condition = LIKE,typeHandler = M9EncryptHandler.class)
    @Excel(name = "申请人联系方式")
    private String phone;

    /**
     * 邮箱地址
     */
    @ApiModelProperty(value = "邮箱地址")
    @Size(max = 255, message = "邮箱地址长度不能超过255")
    @TableField(value = "mail", condition = LIKE)
    @Excel(name = "邮箱地址")
    private String mail;

    /**
     * 开票状态 #{NOT_APPLIED:未申请;REQUESTED:已申请;INVOICED:已开票;REJECTED:被驳回}
     */
    @ApiModelProperty(value = "开票状态 #{NOT_APPLIED:未申请;REQUESTED:已申请;INVOICED:已开票;REJECTED:被驳回}")
    @TableField(value = "invoicing_status")
    @Excel(name = "开票状态 #{NOT_APPLIED:未申请;REQUESTED:已申请;INVOICED:已开票;REJECTED:被驳回}", replace = {"未申请_NOT_APPLIED", "已申请_REQUESTED", "已开票_INVOICED", "被驳回_REJECTED",  "_null"})
    private ExhibitionSettlementInvoicingStatusEnum invoicingStatus;

    /**
     * 申请人
     */
    @ApiModelProperty(value = "申请人")
    @Size(max = 255, message = "申请人长度不能超过255")
    @TableField(value = "application_name", condition = LIKE)
    @Excel(name = "申请人")
    private String applicationName;

    /**
     * 费用类型 #{COST_TYPE_ONE:*会展服务*展览服务费;COST_TYPE_TWO:加班费;COST_TYPE_THREE:展具租赁费;COST_TYPE_FOUR:水、电、气使用费}
     */
    @ApiModelProperty(value = "费用类型 #{COST_TYPE_ONE:*会展服务*展览服务费;COST_TYPE_TWO:加班费;COST_TYPE_THREE:展具租赁费;COST_TYPE_FOUR:水、电、气使用费}")
    @TableField(value = "cost_type")
    @Excel(name = "费用类型 #{COST_TYPE_ONE:*会展服务*展览服务费;COST_TYPE_TWO:加班费;COST_TYPE_THREE:展具租赁费;COST_TYPE_FOUR:水、电、气使用费}", replace = {"*会展服务*展览服务费_COST_TYPE_ONE", "加班费_COST_TYPE_TWO", "展具租赁费_COST_TYPE_THREE", "水、电、气使用费_COST_TYPE_FOUR",  "_null"})
    private ExhibitionSettlementInvoicingCostTypeEnum costType;

    /**
     * 发票抬头
     */
    @ApiModelProperty(value = "发票抬头")
    @Size(max = 255, message = "发票抬头长度不能超过255")
    @TableField(value = "invoice_title", condition = LIKE)
    @Excel(name = "发票抬头")
    private String invoiceTitle;

    /**
     * 收件人
     */
    @ApiModelProperty(value = "收件人")
    @Size(max = 255, message = "收件人长度不能超过255")
    @TableField(value = "addressee", condition = LIKE)
    @Excel(name = "收件人")
    private String addressee;

    /**
     * 收件人电话
     */
    @ApiModelProperty(value = "收件人电话")
    @Size(max = 255, message = "收件人电话长度不能超过255")
    @TableField(value = "addressee_tel", condition = LIKE)
    @Excel(name = "收件人电话")
    private String addresseeTel;

    /**
     * 收件人邮箱
     */
    @ApiModelProperty(value = "收件人邮箱")
    @Size(max = 255, message = "收件人邮箱长度不能超过255")
    @TableField(value = "addressee_email", condition = LIKE)
    @Excel(name = "收件人邮箱")
    private String addresseeEmail;

    /**
     * 收件人地址
     */
    @ApiModelProperty(value = "收件人地址")
    @Size(max = 255, message = "收件人地址长度不能超过255")
    @TableField(value = "to_address", condition = LIKE)
    @Excel(name = "收件人地址")
    private String toAddress;

    /**
     * 公司id
     */
    @ApiModelProperty(value = "公司id")
    @TableField(value = "company_id")
    @Excel(name = "公司id")
    private Long companyId;


    @Builder
    public ExhibitionSettlementInvoicing(Long id, Long createdBy, LocalDateTime createTime, Long updatedBy, LocalDateTime updateTime, 
                    Integer isEnabled, Integer isDeleted, Long projectId, Long subsystemId, Long tenantId, 
                    String settlementNo, BigDecimal invoicedAmount, ExhibitionSettlementInvoicingInvoiceTypeEnum invoiceType, String companyName, String taxpayerIdNo, String companyAddress, 
                    String tel, String bankName, String bankAccountNum, String phone, String mail, ExhibitionSettlementInvoicingStatusEnum invoicingStatus, 
                    String applicationName, ExhibitionSettlementInvoicingCostTypeEnum costType, String invoiceTitle, String addressee, String addresseeTel, String addresseeEmail, 
                    String toAddress, Long companyId) {
        this.id = id;
        this.createdBy = createdBy;
        this.createTime = createTime;
        this.updatedBy = updatedBy;
        this.updateTime = updateTime;
        this.isEnabled = isEnabled;
        this.isDeleted = isDeleted;
        this.projectId = projectId;
        this.subsystemId = subsystemId;
        this.tenantId = tenantId;
        this.settlementNo = settlementNo;
        this.invoicedAmount = invoicedAmount;
        this.invoiceType = invoiceType;
        this.companyName = companyName;
        this.taxpayerIdNo = taxpayerIdNo;
        this.companyAddress = companyAddress;
        this.tel = tel;
        this.bankName = bankName;
        this.bankAccountNum = bankAccountNum;
        this.phone = phone;
        this.mail = mail;
        this.invoicingStatus = invoicingStatus;
        this.applicationName = applicationName;
        this.costType = costType;
        this.invoiceTitle = invoiceTitle;
        this.addressee = addressee;
        this.addresseeTel = addresseeTel;
        this.addresseeEmail = addresseeEmail;
        this.toAddress = toAddress;
        this.companyId = companyId;
    }

}
